/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package puertocom;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Marcelo
 */
public class ImplProtocolo {
    byte[] buffer = new byte[1024];  
    int pos = 0;
    public static FrmChat frmChat = null;
    boolean esArchivo = false;
    int tamArchivo = 0;
    OutputStream os;
    
    int bytesTransferidos = 0;
    
    public void seRecibio(byte b[], int size)
    {
        for (int c=0;c<size;c++)
        {
            seRecibio((int)b[c]);
        }
    }
    
    public void seRecibio(int b) {  
        // Si se encuentra un saldo de linea, procesa los datos anteriores como si fuera un mensaje aparte.
        System.out.print(b + " ");
        
        if (esArchivo == true)
        {
            try 
            {
                System.out.print(b + " ");
                os.write(b);
                bytesTransferidos++;
                
                if (frmChat != null)
                {
                    frmChat.recibido(bytesTransferidos, tamArchivo);
                }
                if (bytesTransferidos == tamArchivo)
                {
                    pos=0;
                    esArchivo = false;
                    os.flush();
                    os.close();
                    os = null;
                    System.out.println("Transferencia completada");
                    
                    if (frmChat != null)
                    {
                        frmChat.transferenciaCompleta();
                    }
                }
            } catch (IOException ex) {
                Logger.getLogger(ImplProtocolo.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NullPointerException ex) {
                System.err.println("Null");
            }
        }
        else if (b == '\n') {  
            System.out.println("CR");
            trabajaMensaje();  
        } else {  
            buffer[pos] = (byte)b;  
            pos++;  
        }  
    }  
   
    
    public void seCerroStream() {  
        trabajaMensaje();  
    }
    
    /* 
     * When message is recognized onMessage is invoked  
     */  
    private void trabajaMensaje() 
    {
        if (pos != 0) {  
            // construir el mensaje, lo hace mediante la funcion getMessage pasandole como parametros el buffer de datos y en que posicion se quedo
            String message = getMessage(buffer, pos);
            
            if (!esArchivo)
                System.out.println("<< " + message);  
              
            // implementacion del protocolo personal
            if (message.startsWith("MSG ")) //si empieza con MSG, se refiere a un mensaje y lo tratamos como tal
            {
                String realMsg = message.substring(4);//el mensaje que realmente debemos mostrar en pantalla, es el recibido pero quitando el MSG
                System.out.println("Mensaje: " + realMsg);//mostramos el mensaje en la consola
                
                //si esque esta disponible un JForm, mostramos alli el mensaje
                if (frmChat !=null)
                    frmChat.addMessage(realMsg);
                
                //enviamos una señal que si recibimos el mensaje
                Emisor.send("OK\n");  
            } 
            else if (message.startsWith("FILE "))
            {
                StringTokenizer tokens = new StringTokenizer(message);
                tokens.nextToken();
                int tam = Integer.parseInt( tokens.nextToken() );
                String nomArchivo = tokens.nextToken("\n");
                
                if (frmChat != null)
                {
                    frmChat.iniciaRecepcion(tam, nomArchivo);
                }
                
                
                tamArchivo = tam;                
                esArchivo = true;
                bytesTransferidos = 0;
                try {
                    System.out.println("NomArchivo: " + nomArchivo);
                    os = new FileOutputStream(nomArchivo);
                } catch (FileNotFoundException ex) {
                    Logger.getLogger(ImplProtocolo.class.getName()).log(Level.SEVERE, null, ex);
                }
                
            }
            else if (message.startsWith("DISCONNECT"))
            {
                if (frmChat != null)
                {
                    frmChat.desconexion();
                }
            }
            else if (message.equals("OK")) //si el mensaje es un OK, enviamos otro OK R de respuesta
            {  
                Emisor.send("OK R\n");  
            }  
            pos = 0;//como ya se recibio el mensaje, la posicion del nuevo mensaje empezara desde cero
        }  
    }  
    
    //construye el mensaje que vamos a enviar, a formato de mensaje utilizando un protocolo personal
    public static String getMessageFormat(String message)
    {
        return "MSG " + message + "\n";
    }
    
    //construye el mensaje dado un buffer y el tamaño de bytes con los que se debe constuir
    public String getMessage(byte[] buffer, int len) {  
        return new String(buffer, 0, pos);  
    }      
}
